that weren't before.
Signed-off-by: Keir Fraser <keir@xensource.com>
}
-int
+int __init
acm_init(char *policy_start,
unsigned long policy_len)
{
extern unsigned long initial_images_nrpages(void);
extern void discard_initial_images(void);
-static long dom0_nrpages, dom0_min_nrpages, dom0_max_nrpages = LONG_MAX;
+static long __initdata dom0_nrpages;
+static long __initdata dom0_min_nrpages;
+static long __initdata dom0_max_nrpages = LONG_MAX;
/*
* dom0_mem=[min:<min_amt>,][max:<max_amt>,][<amt>]
* If +ve: The specified amount is an absolute value.
* If -ve: The specified amount is subtracted from total available memory.
*/
-static long parse_amt(const char *s, const char **ps)
+static long __init parse_amt(const char *s, const char **ps)
{
long pages = parse_size_and_unit((*s == '-') ? s+1 : s, ps) >> PAGE_SHIFT;
return (*s == '-') ? -pages : pages;
}
-static void parse_dom0_mem(const char *s)
+static void __init parse_dom0_mem(const char *s)
{
do {
if ( !strncmp(s, "min:", 4) )
#define round_pgup(_p) (((_p)+(PAGE_SIZE-1))&PAGE_MASK)
#define round_pgdown(_p) ((_p)&PAGE_MASK)
-static struct page_info *alloc_chunk(struct domain *d, unsigned long max_pages)
+static struct page_info * __init alloc_chunk(
+ struct domain *d, unsigned long max_pages)
{
struct page_info *page;
unsigned int order;
return page;
}
-static unsigned long compute_dom0_nr_pages(void)
+static unsigned long __init compute_dom0_nr_pages(void)
{
unsigned long avail = avail_domheap_pages() + initial_images_nrpages();
return dom0_nrpages;
}
-static void process_dom0_ioports_disable(void)
+static void __init process_dom0_ioports_disable(void)
{
unsigned long io_from, io_to;
char *t, *s = opt_dom0_ioports_disable;
}
}
-int construct_dom0(struct domain *d,
- unsigned long _image_start, unsigned long image_len,
- unsigned long _initrd_start, unsigned long initrd_len,
- char *cmdline)
+int __init construct_dom0(
+ struct domain *d,
+ unsigned long _image_start, unsigned long image_len,
+ unsigned long _initrd_start, unsigned long initrd_len,
+ char *cmdline)
{
int i, rc, compatible, compat32, order, machine;
struct cpu_user_regs *regs;
#include <xen/config.h>
+#include <xen/init.h>
#include <xen/perfc.h>
#include <xen/spinlock.h>
#include <asm/uaccess.h>
extern struct exception_table_entry __start___pre_ex_table[];
extern struct exception_table_entry __stop___pre_ex_table[];
-static void sort_exception_table(struct exception_table_entry *start,
- struct exception_table_entry *end)
+static void __init sort_exception_table(struct exception_table_entry *start,
+ struct exception_table_entry *end)
{
struct exception_table_entry *p, *q, tmp;
}
}
-void sort_exception_tables(void)
+void __init sort_exception_tables(void)
{
sort_exception_table(__start___ex_table, __stop___ex_table);
sort_exception_table(__start___pre_ex_table, __stop___pre_ex_table);
memset(frame_table, 0, nr_pages << PAGE_SHIFT);
}
-void arch_init_memory(void)
+void __init arch_init_memory(void)
{
extern void subarch_init_memory(void);
#ifndef MEMORY_GUARD
init_xenheap_pages(__pa(__per_cpu_start) + (first_unused << PERCPU_SHIFT),
__pa(__per_cpu_end));
+#endif
+ memguard_guard_range(&__per_cpu_start[first_unused << PERCPU_SHIFT],
+ (NR_CPUS - first_unused) << PERCPU_SHIFT);
+#if defined(CONFIG_X86_64)
+ /* Also zap the mapping in the 1:1 area. */
+ memguard_guard_range(__va(__pa(__per_cpu_start)) +
+ (first_unused << PERCPU_SHIFT),
+ (NR_CPUS - first_unused) << PERCPU_SHIFT);
#endif
}
}
}
+void init_done(void)
+{
+ extern char __init_begin[], __init_end[];
+
+ /* Free (or page-protect) the init areas. */
+#ifndef MEMORY_GUARD
+ init_xenheap_pages(__pa(__init_begin), __pa(__init_end));
+#endif
+ memguard_guard_range(__init_begin, __init_end - __init_begin);
+#if defined(CONFIG_X86_64)
+ /* Also zap the mapping in the 1:1 area. */
+ memguard_guard_range(__va(__pa(__init_begin)), __init_end - __init_begin);
+#endif
+ printk("Freed %ldkB init memory.\n", (long)(__init_end-__init_begin)>>10);
+
+ startup_cpu_idle_loop();
+}
+
void __init __start_xen(multiboot_info_t *mbi)
{
char __cmdline[] = "", *cmdline = __cmdline;
domain_unpause_by_systemcontroller(dom0);
- startup_cpu_idle_loop();
+ reset_stack_and_jump(init_done);
}
void arch_get_xen_caps(xen_capabilities_info_t *info)
flush_tlb_all_pge();
}
-void subarch_init_memory(void)
+void __init subarch_init_memory(void)
{
unsigned long m2p_start_mfn;
unsigned int i, j;
flush_tlb_all_pge();
}
-void subarch_init_memory(void)
+void __init subarch_init_memory(void)
{
unsigned long i, v, m2p_start_mfn;
l3_pgentry_t l3e;
return rc;
}
-void
+void __init
initialise_gdb(void)
{
gdb_ctx->serhnd = serial_parse_handle(opt_gdb);
bit. */
}
-void initialize_keytable(void)
+void __init initialize_keytable(void)
{
open_softirq(KEYPRESS_SOFTIRQ, keypress_softirq);
*/
static unsigned int dma_bitsize = CONFIG_DMA_BITSIZE;
static unsigned long max_dma_mfn = (1UL<<(CONFIG_DMA_BITSIZE-PAGE_SHIFT))-1;
-static void parse_dma_bits(char *s)
+static void __init parse_dma_bits(char *s)
{
unsigned int v = simple_strtol(s, NULL, 0);
if ( v >= (BITS_PER_LONG + PAGE_SHIFT) )
* lowmem emergency pool.
*/
static unsigned long dma_emergency_pool_pages;
-static void parse_dma_emergency_pool(char *s)
+static void __init parse_dma_emergency_pool(char *s)
{
unsigned long long bytes;
bytes = parse_size_and_unit(s, NULL);
static unsigned long first_valid_mfn = ~0UL;
/* Initialise allocator to handle up to @max_page pages. */
-paddr_t init_boot_allocator(paddr_t bitmap_start)
+paddr_t __init init_boot_allocator(paddr_t bitmap_start)
{
unsigned long bitmap_size;
return bitmap_start + bitmap_size;
}
-void init_boot_pages(paddr_t ps, paddr_t pe)
+void __init init_boot_pages(paddr_t ps, paddr_t pe)
{
unsigned long bad_spfn, bad_epfn, i;
const char *p;
}
}
-int reserve_boot_pages(unsigned long first_pfn, unsigned long nr_pfns)
+int __init reserve_boot_pages(unsigned long first_pfn, unsigned long nr_pfns)
{
unsigned long i;
return 1;
}
-unsigned long alloc_boot_low_pages(
+unsigned long __init alloc_boot_low_pages(
unsigned long nr_pfns, unsigned long pfn_align)
{
unsigned long pg, i;
return 0;
}
-unsigned long alloc_boot_pages(
+unsigned long __init alloc_boot_pages(
unsigned long nr_pfns, unsigned long pfn_align)
{
unsigned long pg, i;
#define avail_for_domheap(mfn) \
(!allocated_in_map(mfn) && !is_xen_heap_frame(mfn_to_page(mfn)))
-void end_boot_allocator(void)
+void __init end_boot_allocator(void)
{
unsigned long i;
int curr_free, next_free;
* convoluted than appears necessary because we do not want to continuously
* hold the lock while scrubbing very large memory areas.
*/
-void scrub_heap_pages(void)
+void __init scrub_heap_pages(void)
{
void *p;
unsigned long mfn;
rcu_init_percpu_data(cpu, &rcu_ctrlblk, rdp);
}
-void rcu_init(void)
+void __init rcu_init(void)
{
rcu_online_cpu(smp_processor_id());
open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
* trace buffers. The trace buffers are then available for debugging use, via
* the %TRACE_xD macros exported in <xen/trace.h>.
*/
-void init_trace_bufs(void)
+void __init init_trace_bufs(void)
{
if ( opt_tbuf_size == 0 )
{
return (lvlnum); \
}
-static int __parse_loglvl(char *s, char **ps)
+static int __init __parse_loglvl(char *s, char **ps)
{
___parse_loglvl(s, ps, "none", 0);
___parse_loglvl(s, ps, "error", 1);
return 2; /* sane fallback */
}
-static void _parse_loglvl(char *s, int *lower, int *upper)
+static void __init _parse_loglvl(char *s, int *lower, int *upper)
{
*lower = *upper = __parse_loglvl(s, &s);
if ( *s == '/' )
*upper = *lower;
}
-static void parse_loglvl(char *s)
+static void __init parse_loglvl(char *s)
{
_parse_loglvl(s, &xenlog_lower_thresh, &xenlog_upper_thresh);
}
-static void parse_guest_loglvl(char *s)
+static void __init parse_guest_loglvl(char *s)
{
_parse_loglvl(s, &xenlog_guest_lower_thresh, &xenlog_guest_upper_thresh);
}
-static char *loglvl_str(int lvl)
+static char * __init loglvl_str(int lvl)
{
switch ( lvl )
{
safe_strcpy(printk_prefix, prefix);
}
-void init_console(void)
+void __init init_console(void)
{
char *p;
}
}
-void console_endboot(void)
+void __init console_endboot(void)
{
int i, j;
return 1;
}
-static void ns16550_init_preirq(struct serial_port *port)
+static void __init ns16550_init_preirq(struct serial_port *port)
{
struct ns16550 *uart = port->uart;
unsigned char lcr;
port->tx_fifo_size = 16;
}
-static void ns16550_init_postirq(struct serial_port *port)
+static void __init ns16550_init_postirq(struct serial_port *port)
{
struct ns16550 *uart = port->uart;
int rc, bits;
}
#ifdef CONFIG_X86
-static void ns16550_endboot(struct serial_port *port)
+static void __init ns16550_endboot(struct serial_port *port)
{
struct ns16550 *uart = port->uart;
if ( ioports_deny_access(dom0, uart->io_base, uart->io_base + 7) != 0 )
.irq = ns16550_irq
};
-static int parse_parity_char(int c)
+static int __init parse_parity_char(int c)
{
switch ( c )
{
return; \
} while ( 0 )
-static void ns16550_parse_port_config(struct ns16550 *uart, const char *conf)
+static void __init ns16550_parse_port_config(
+ struct ns16550 *uart, const char *conf)
{
int baud;
serial_register_uart(uart - ns16550_com, &ns16550_driver, uart);
}
-void ns16550_init(int index, struct ns16550_defaults *defaults)
+void __init ns16550_init(int index, struct ns16550_defaults *defaults)
{
struct ns16550 *uart = &ns16550_com[index];
return SERIAL_TXBUFSZ - (port->txbufp - port->txbufc);
}
-void serial_init_preirq(void)
+void __init serial_init_preirq(void)
{
int i;
for ( i = 0; i < ARRAY_SIZE(com); i++ )
com[i].driver->init_preirq(&com[i]);
}
-void serial_init_postirq(void)
+void __init serial_init_postirq(void)
{
int i;
for ( i = 0; i < ARRAY_SIZE(com); i++ )
com[i].driver->init_postirq(&com[i]);
}
-void serial_endboot(void)
+void __init serial_endboot(void)
{
int i;
for ( i = 0; i < ARRAY_SIZE(com); i++ )
vga_w(regbase, VGA_ATT_W, val);
}
-static int detect_video(void *video_base)
+static int __init detect_video(void *video_base)
{
volatile u16 *p = (volatile u16 *)video_base;
u16 saved1 = p[0], saved2 = p[1];
}
/* This is actually code from vgaHWRestore in an old version of XFree86 :-) */
-static void *setup_vga(void)
+static void * __init setup_vga(void)
{
/* The following VGA state was saved from a chip in text mode 3. */
static unsigned char regs[] = {
return NULL;
}
-static int vga_set_scanlines(unsigned scanlines)
+static int __init vga_set_scanlines(unsigned scanlines)
{
unsigned vtot, ovr, vss, vbs;
uint8_t vse, vbe, misc = 0;
static unsigned font_slot = 0;
integer_param("fontslot", font_slot);
-static int vga_load_font(const struct font_desc *font, unsigned rows)
+static int __init vga_load_font(const struct font_desc *font, unsigned rows)
{
unsigned fontheight = font ? font->height : 16;
uint8_t fsr = vga_rcrt(vgabase, VGA_CRTC_MAX_SCAN); /* Font size register */
#define ATTRIBUTE 7
#define VIDEO_SIZE (COLUMNS * LINES * 2)
-void vga_init(void)
+void __init vga_init(void)
{
char *p;
vgacon_enabled = 1;
}
-void vga_endboot(void)
+void __init vga_endboot(void)
{
if ( !vgacon_enabled )
return;
}
}
-int fill_console_start_info(struct dom0_vga_console_info *ci)
+int __init fill_console_start_info(struct dom0_vga_console_info *ci)
{
memset(ci, 0, sizeof(*ci));